<?php

namespace Common\Behavior;

use Think\Behavior;
use Think\Hook;

/**
 * 权限验证
 * Class AuthBehavior
 * @package Common\Behavior
 */
class AuthBehavior extends Behavior
{
    private $auth_type = array(
        'login_auth', 'ctrl_auth'
    );

    /* 旧方法 扩展起来存在弊端
     public function run(&$params)
    {
        if (is_array($params['auth_type']))
            $this->auth_type = array_merge($this->auth_type, $params['auth_type']); // 工厂扩展
        Hook::listen('auth_start', $this); //
        $AuthCheckDao = D('Common/AuthCheck', 'Logic'); // 权限检测逻辑类
        foreach ($this->auth_type as $v) {
            // 验证类型
            $_auth = true;
            if (isset($params[$v]))
                $_auth = $params[$v];
            if ($_auth && method_exists($AuthCheckDao, $v)) {
                $AuthCheckDao->{$v}($_auth); // 执行验证
            }
        }
        Hook::listen('auth_end', $this);
    }*/
    /**
     * 改用钩子进行多方验证
     * @param mixed $params
     */
    public function run(&$params)
    {
        if (is_array($params['auth_type']))
            $this->auth_type = array_merge($this->auth_type, $params['auth_type']); // 工厂扩展
        Hook::listen('auth_start', $this); // 验证开始
        foreach ($this->auth_type as $v) {
            // 验证类型
            $_auth = true; // 默认开启所有验证
            if (isset($params[$v]))
                $_auth = $params[$v]; // 是否开启验证
            if($_auth) {
                // 由控制器决定哪些页面不需要验证
                // 开始验证
                Hook::listen(parse_name($v, 1), $params[$v]); // 钩子监听拦截
            }
        }
        Hook::listen('auth_end', $this);
    }
}